package io;


import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 通过提高每次读写的数据量，减少实际读写的次数，可以提高读写效率
 *
 * 单字节的读写属于随机读写形式
 * 一组字节的读写属于块读写形式
 * 大多数的映射快读写都比随机读写性能好，尤其机械硬盘上体现最高为明显
 *
 * InputStream和OutputStream上定义了块读写数据的相关方法
 *
 */
public class CopyDemo2 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("自我介绍.pptx");
        FileOutputStream fos = new FileOutputStream("自我介绍_cp.pptx");

        /*
            InputStream中提供了块服务操作
            int read(byte[] data)

            一次性读取给定字节数组总长度的字节量，并存入到数组中，返回值为实际读取到的字节量，如果返回值为-1表示读取到了末尾

            假设
            ppt内容为
            00000011 11100000 11100001 11100000 00110011 11101000 11100101

            byte[] date = new byte[4];//创建一个长度为4的字节数组

            int len;

            第一次调用：
            len = fis.read(data);
            从ppt中一次读取了四个字节

            data{00000011 11100000 11100001 11100000}
            len为4

            第二次调用没有四个字节了
            从ppt中读取到的内容
            data{00110011 11101000 11100101 11100000}
                 ^^^^^^^^ ^^^^^^^^ ^^^^^^^^
                 |新的数据                   ||   旧的 |
            len为3

            第三次调用
            数组没有任何变化 全是旧数据
            返回值len为-1，表示读取到了末尾

         */

        /*
            8位2进制 00000000 1byte 1字节
            1024byte  1kb
            1024kb    1mb
            1024mb    1gb
            1024gb    1tb
         */
        byte[] data = new byte[1024 * 10];//10kb缓冲区
        int len;//每次实际读取到的字节数

        long start = System.currentTimeMillis();
        while((len = fis.read(data)) != -1){
            fos.write(data, 0, len);
        }

        long end = System.currentTimeMillis();


        System.out.println("赋值完毕" + (end - start) + "ms");



        fis.close();
        fos.close();
    }

}
